using System;
using System.Collections.Generic;
using System.Transactions;

using PMServiceDesk.DataType;
using PMServiceDesk.DataAccess;
using PMServiceDesk.Parameters.Constantes;

namespace PMServiceDesk.BusinessLogic
{
    public class CalendarioLogic
    {
        #region Variables

        private CalendarioData _calendarioData;

        #endregion

        #region Constructores

        public CalendarioLogic()
        {
            _calendarioData = new CalendarioData();
        }

        #endregion

        #region Metodos

        public CalendarioType CargarPorId(string id)
        {
            _calendarioData.FiltrarPorId(id);

            return _calendarioData.Cargar();
        }

        public CalendarioType CargarPorProyecto(string proyectoId,string nombre)
        {
            _calendarioData.FiltrarPorProyectoId(proyectoId);
            _calendarioData.FiltrarPorNombre(nombre);

            return _calendarioData.Cargar();
        }


        public void GrabarCalendario(CalendarioType calendario)
        {
            using (TransactionScope transaccion = new TransactionScope())
            {
                this.Grabar(calendario);

                transaccion.Complete();
            }
        }

        public void Grabar(CalendarioType calendario)
        {
            bool nuevo = (calendario.Id == "0");

            _calendarioData.Grabar(calendario);

            if (!nuevo) return;

            this.NuevoCalendario(calendario);
        }

        public void NuevoCalendario(CalendarioType calendario)
        {
            calendario.DiasCalendario = new List<DiaCalendarioType>();

            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Lunes, Parametros.DiaSemanaDW_Lunes));
            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Martes, Parametros.DiaSemanaDW_Martes));
            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Miercoles, Parametros.DiaSemanaDW_Miercoles));
            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Jueves, Parametros.DiaSemanaDW_Jueves));
            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Viernes, Parametros.DiaSemanaDW_Viernes));
            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Sabado, Parametros.DiaSemanaDW_Sabado, false));
            calendario.DiasCalendario.Add(this.NuevoDia(calendario.Id, Parametros.DiaSemana_Domingo, Parametros.DiaSemanaDW_Domingo, false));

            DiaCalendarioLogic logicDiaCalendario = new DiaCalendarioLogic();

            logicDiaCalendario.RegistrarDiasCalendario(calendario);
        }

        public DiaCalendarioType NuevoDia(string calendarioId, string parametroDiaId,string diaSemanaDW, bool laborable = true)
        {
            DiaCalendarioType dia = new DiaCalendarioType();

            dia = new DiaCalendarioType();
            dia.CalendarioId = calendarioId;
            dia.DiaSemanaId = parametroDiaId;
            dia.DiaSemanaDW = diaSemanaDW;
            dia.Laborable = laborable;
            dia.Horarios = new List<DiaHorarioType>();

            if (!laborable) return dia;

            DiaHorarioType horario = null;

            horario = new DiaHorarioType();
            horario.HorarioInicio = "09:00";
            horario.HorarioFin = "13:00";
            dia.Horarios.Add(horario);

            horario = new DiaHorarioType();
            horario.HorarioInicio = "14:00";
            horario.HorarioFin = "18:00";
            dia.Horarios.Add(horario);

            return dia;
        }

        public List<CalendarioType> CargarExploradorPaginado(CalendarioType registroBusqueda, int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _calendarioData.FiltrarPorProyectoId(registroBusqueda.ProyectoId);
            if (registroBusqueda.Nombre != "") _calendarioData.FiltrarPorNombre(registroBusqueda.Nombre);
            if (registroBusqueda.Descripcion != "") _calendarioData.FiltrarPorDescripcion(registroBusqueda.Descripcion);

            return _calendarioData.CargarListaVista(paginaActual,cantidadMostrar,orderBy);
        }

        #endregion
    }
}
